/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package moonnms.libs;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map.Entry;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import moonnms.libs.structs.structMacAddrInfo;

/**
 *
 * @author Di_Moon
 */
public class libNMSMacAddrTable {
    private HashMap<String, structMacAddrInfo> table;
    
    public libNMSMacAddrTable() {
        table = new HashMap<>();
    }
    
    // добавление информации о мак адресе
    public boolean put(String mac, int port, int vlan) {
        structMacAddrInfo macInfo;
        
        mac = checkMac(mac);
        
        // Если на входе были данные не похожие на мак-адрес, выйдем из функции
        if(mac==null) return false;
        
        // Хэш хранения состоит из макадрес+порт, на случай возможных глюков свитча,
        // когда мак адрес на нескольких портах
        String hashKey = port+"."+mac;

        macInfo = new structMacAddrInfo();
        macInfo.mac = mac;
        macInfo.port = port;
        macInfo.vlan = vlan;
        table.put(hashKey, macInfo);
        
        return true;
    }
    
    // Поиск информации о мак адресе
    public structMacAddrInfo find(String fmac) {
        for (String mac : table.keySet()) {
            Matcher matcher = Pattern.compile("^(\\d+)\\.("+fmac+")").matcher(mac);
            if(matcher.find()) {
                System.out.println(matcher.group());
                return table.get(matcher.group());
            }
        }       
        
        return null;
    }
    
    public List getMacList() {
        List rv = new LinkedList();
        
        for (String mac : table.keySet()) {
            Matcher matcher = Pattern.compile("^(\\d+)\\.([0-9a-f]*)").matcher(mac);
            if(matcher.find()) {
                rv.add(matcher.group(2));
            }
        }       
        
        return rv;
    }
    
    // Функция проверяет, является ли строка ьак адресом и приводит его к внутреннему виду (без разделителей)
    public static String checkMac(String rawmac) {
        rawmac = rawmac.trim();
        String strPattern = "^([0-9a-fA-F]{1,2}[\\.:-]{0,1}){5}([0-9a-fA-F]{1,2})$";
        String mac = null;
        
        if(rawmac.matches(strPattern)) {
            mac = rawmac.toLowerCase().replaceAll("[\\.:-]", "");
        }
        
        return mac;
    }
    
    // Возвращает массив всех мак-адресов с информацией
    public ArrayList<structMacAddrInfo> getMacTable() {
        ArrayList<structMacAddrInfo> retVal = new ArrayList();
        
        for(Entry<String, structMacAddrInfo> entry : table.entrySet()) {
            retVal.add(entry.getValue());
        }
        
        return retVal;
    }
    
    @Override
    public String toString() {
        return table.toString();
    }
}
